/*
 * @Author: 吴世扬 18368095041@163.com
 * @Date: 2024-05-15 15:49:34
 * @LastEditors: 吴世扬 18368095041@163.com
 * @LastEditTime: 2024-10-17 09:06:53
 * @FilePath: /react18-vite-admin/vite.config.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
import {
    UserConfig,
    ConfigEnv,
    loadEnv,
    defineConfig,
    type PluginOption
} from 'vite';
import react from '@vitejs/plugin-react-swc';
import UnoCSS from 'unocss/vite';
import { resolve } from 'path';
import {
    name,
    version,
    engines,
    dependencies,
    devDependencies
} from './package.json';
import { viteCommonjs } from '@originjs/vite-plugin-commonjs';
import { reactScopedCssPlugin } from 'rollup-plugin-react-scoped-css';

/** 平台的名称、版本、运行所需的`node`版本、依赖、构建时间的类型提示 */
const __APP_INFO__ = {
    pkg: { name, version, engines, dependencies, devDependencies },
    buildTimestamp: Date.now()
};

const pathSrc = resolve(__dirname, 'src');
// https://vitejs.dev/config/
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
    const env = loadEnv(mode, process.cwd());
    return {
        base: mode === 'development' ? '/admin' : './',
        resolve: {
            alias: {
                '@': pathSrc
            }
        },
        css: {
            // CSS 预处理器
            preprocessorOptions: {
                // 定义全局 SCSS 变量
                scss: {
                    javascriptEnabled: true,
                    additionalData: `
            @use "@/styles/variables.scss" as *;
          `
                }
            }
        },
        server: {
            // 允许IP访问
            host: '0.0.0.0',
            // 应用端口 (默认:3000)
            port: Number(env.VITE_APP_PORT),
            // 运行是否自动打开浏览器
            open: true,
            proxy: {
                /** 代理前缀为 /dev-api 的请求  */
                [env.VITE_APP_BASE_API]: {
                    target: 'http://172.16.10.161:12801/', // 'https://grid.bhwgt.com/','http://172.16.10.161:12801/'、、'https://grid.cskj-test.top/'
                    changeOrigin: true,
                    secure: false, // 验证SSL
                    rewrite: (path) =>
                        path.replace(
                            new RegExp('^' + env.VITE_APP_BASE_API),
                            ''
                        )
                }
            }
            // vite生成的sourcemap有问题断点位置对应不对，直接在浏览器关闭吧，vite没找到选项
        },
        plugins: [
            viteCommonjs(),
            UnoCSS({
                hmrTopLevelAwait: false
            }),
            react(),
            reactScopedCssPlugin() as PluginOption[]
        ],
        // 预加载项目必需的组件
        optimizeDeps: {
            include: [
                'react'
                // 'vue-router',
                // 'pinia',
                // 'axios',
                // '@vueuse/core',
                // 'sortablejs'
            ]
        },
        // 构建配置
        build: {
            chunkSizeWarningLimit: 2000, // 消除打包大小超过500kb警告
            minify: 'terser', // Vite 2.6.x 以上需要配置 minify: "terser", terserOptions 才能生效
            terserOptions: {
                compress: {
                    keep_infinity: true, // 防止 Infinity 被压缩成 1/0，这可能会导致 Chrome 上的性能问题
                    drop_console: true, // 生产环境去除 console
                    drop_debugger: true // 生产环境去除 debugger
                },
                format: {
                    comments: false // 删除注释
                }
            },
            rollupOptions: {
                output: {
                    // manualChunks: {
                    //   "vue-i18n": ["vue-i18n"],
                    // },
                    // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
                    entryFileNames: 'js/[name].[hash].js',
                    // 用于命名代码拆分时创建的共享块的输出命名
                    chunkFileNames: 'js/[name].[hash].js',
                    // 用于输出静态资源的命名，[ext]表示文件扩展名
                    assetFileNames: (assetInfo: any) => {
                        const info = assetInfo.name.split('.');
                        let extType = info[info.length - 1];
                        // console.log('文件信息', assetInfo.name)
                        if (
                            /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(
                                assetInfo.name
                            )
                        ) {
                            extType = 'media';
                        } else if (
                            /\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name)
                        ) {
                            extType = 'img';
                        } else if (
                            /\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(
                                assetInfo.name
                            )
                        ) {
                            extType = 'fonts';
                        }
                        return `${extType}/[name].[hash].[ext]`;
                    }
                }
            }
        },
        define: {
            __APP_INFO__: JSON.stringify(__APP_INFO__)
        }
    };
});
